//这是一个总的知识类

/**
 * abstract 来修饰一个类，这个类就是一个抽象类
 * 1.不能通过关键字new来进行实例化
 * 2.抽象类主要用来被继承
 * 3.抽象方法，abstract --》 将来一定要在子类当中重写
 * 4.final不能修饰
 *
 * 接口：interface
 * class A implements 接口
 * 1.接口当中所有的成员变量默认都是public static final 修饰的
 * 2.接口当中所有的成员方法默认都是public abstract 修饰的
 */

//实现多个接口 - demo1 包中
//一个类实现多个接口的时候，要把每一个接口的每一个抽象方法全部实现，快捷键为
//Alt + enter 或者 Ctrl + i
//demo1中，实现了一个类Dog继承了一个父类Animal，不仅重写了父类的eat()抽象方法，
//还同时实现了多种接口IRunning,ISwimming,并且讲相关抽象方法也进行了重写

//继承表达的含义是 is - a 关系 Dog is a Animal
//接口表达的含义是 具有xxx特性 狗具有狗刨游泳的特性

//设计的好处：程序员可以忘记类型 接口的使用 使得 类的使用者就不必关注具体类型，只要创建的类具有interface的特性
//就可以拿来用，例如Robert，并不是Animal，但是可以用test2，test3，test4，只需要关注某个类是否具有某种能力

//Java中，类是单继承的，一个类可以实现多个接口
//但是接口之间可以实现多继承，还是用关键字extends 但此时extends 的意思理解为 拓展
// 即接口之间可以实现多继承
//但是需要在之后接入接口的类中将所有方法重写

/**
 * 抽象类和接口的区别
 * 抽象类 和 接口 都是Java中实现多态思想的方法
 * 关键点：
 * 在抽象类中，可以包含普通方法和普通成员变量，这样的普通方法和成员变量可以被子类直接使用(不用重写)(注：不能是被private修饰的)
 * 在接口中，不可以包含普通方法，接口中的方法默认都是抽象的，子类必须要重写所有的抽象方法
 *
 * 具体：
 * 1.结构组成上：抽象类（abstract）普通类 + 抽象方法
 *              接口（interface）全是抽象方法(abstract static)和全局变量(public static final)
 *              Java8之后，default修饰的方法也可以在接口中
 * 2.权限上：抽象类中可以有各种访问修饰限定符，
 *          接口默认全是public
 * 3.子类使用：抽象类的子类使用extends关键字继承抽象类
 *            使用接口的类用implements
 * 4.关系：抽象类可以实现若干接口，意味着一个抽象类要按照这些接口所定义的方法，去提供相应的重写实现，（对于抽象方法在抽象类中可以选择实现某个接口
 * 也可以继续保持抽象留给具体的子类实现），这样做可以让抽象类整合多个接口所代表的不同行为规范，然后具体的子类在
 * 继承这个抽象类的时候，间接也满足了这些接口的要求
 *        接口不能结成抽象类，但是接口可以使用extends关键字继承多个父接口
 * 5.子类限制：抽象类中，一个子类只能继承一个抽象类，单继承
 *            接口中，一个子类可以实现多个接口
 */

/**
 * Object 类：
 * Object是Java默认提供的一个类，Java里面除了object类，剩下所有的类都是存在继承关系的。默认会继承object父类。
 *
 */


//例子：使用Object就接受所有类的对象
//class Person {}
//class Student {}
//
//public class Test {
//    public static void fun(Object obj) {
//        System.out.println(obj);
//    }
//    public static void main(String[] args) {
//        Person person = new Person();
//        Student student = new Student();
//        fun(person);
//        fun(student);
//    }
//}

//在所有的开发之中，Object类是参数的最高统一形式

/**
 * 对象比较的equals方法
 * 在Java中 用 == 进行比较时候
 * 1.如果 == 两边都是基本类型变量，比较的是变量中的值是否相等
 * 2.如果 == 两边是引用类型变量，比较的是引用类型变量中的地址是否相等
 * 3.如果要比较对象中的内容，必须要重写Object中的equals方法，因为equals方法默认也是按照地址比较的
 *
 * 结论：比较对象是自定义类型创建的对象李米娜的内容是否相同的时候，一定要重写equals方法
 *
 */

/**
 * hasCode
 * 1.hasCode方法用来确定对象在内存中存储的位置是否相同
 * 2.在逻辑上想把两个对象放在同一个位置，则重写hasCode方法
 */

